称为 java new io 是因为 NIO 是 jdk1.4 才引入,于 jdk1.0 的 IO 不同, 官方叫法。
java 非阻塞 IO。这么 NIO 的特性来叫的。
java nio.2 这个意味在原始的 NIO 之上提供了一些的 API。
- 同步:就是在发出一个调用时,在没有得到结果之前,该调用就不能返回,调用一旦返回,意味着得到了返回值
- 异步:调用发出后,调用立即返回,没有返回结果,被调用者接到通知,计算出结果,通知调用者来取结果。
阻塞和非阻塞描述的是线程的状态。
图1 (引用自 https://www.zhihu.com/question/27991975 芸芸有度 的回答)
- java.nio: 定义了 buffers, buffer 用来装数据。java.nio 包提供了一个概览对于其他 NIO 包
- java.nio.chalnnels: 定义 channels, channels 代表实体之间的连接。channels 能执行一些 IO 操作。定义了 selectors,为了复用和非阻塞的 IO 操作。
java.nio.channels.spi 末尾的 spi 代表的是 Service Provider Interface, 是JDK内置的一种服务提供发现机制。一般来说普通程序员不需要管。
SPI 详细介绍 SPI解释
java.nio.charset 定义了一些字符集和有关的操作
java.nio.file 是 JDK1.7 加入的,里面新增加了 Files,Path 类,对文件系统操作更加方便。
channels 初略介绍参考: channels基础介绍
以下截图来自 JDK11 文档:
示例代码
@Test
public void test0() throws IOException {
RandomAccessFile randomAccessFile = new RandomAccessFile("abc.txt", "rw"); // throws FileNotFoundException
FileChannel inChannel = randomAccessFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int byteRead = inChannel.read(buf);// throws IOException
while (byteRead != -1){
System.out.println(byteRead);
buf.flip();
while (buf.hasRemaining()){
System.out.println((char)buf.get()); // 针对 ASCII 字符, 中文用 CharBuffer
}
buf.clear();
byteRead = inChannel.read(buf);
}
}
public abstract class FileChannel
extends AbstractInterruptibleChannel
implements SeekableByteChannel, GatheringByteChannel, ScatteringByteChannel
例子:
还有很多内容就不一一列举了。
学习 nio 过程中觉得有所收获的网页地址列举如下:
最后推荐通读一遍官方对于nio 这几个包的介绍
最后增加了一个 BIO, NIO Socket编程的示例。
BIO (在nio当前目录的code/bio目录下)
NIO (在nio当前目录的code/bio目录下)
- gl
- v1.0 2018/10/05